home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 140
/
Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z
/
Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin
/
games
/
km21
/
src
/
trlib.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-12-05
|
9KB
|
497 lines
/*
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
トランプドライバ用ライブラリ
by 電魔団\shoryu 1993
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
*/
//スーパーバイザで使用するよう改良
//#define LIBTEST
extern int _tr_put();
extern int _tr_put_lh();
extern int _tr_put_lq();
extern int _tr_put_rh();
extern int _tr_put_rq();
extern int _tr_put_uh();
extern int _tr_put_uq();
extern int _tr_put_dh();
extern int _tr_put_dq();
short *TrumpPatternBuffer=-1; //誰も使わないような名前で最初は -1 が入っている
/*
NULデバイスのデバイスヘッダのアドレスをかえす
戻り値:
NULデバイスのデバイスヘッダのトップアドレス
*/
int *GetNulDeviceHeader(void)
{
char NULhead[4+1]="NUL "; // \x00がじゃまやんこいやぁ
short NULattr=0x8024; // NULデバイスのアトリビュート
int *NULvar; // 'NUL 'の値を指すアドレス
short *NULaddr; // 'NUL 'を探しているアドレス
// int ssp;
char *addr;
int *saddr;
/*
! NULデバイスのサーチ
*/
// ssp=B_SUPER(0);
NULaddr=(short *)0x6800; // Human 68K のトップアドレス
NULvar=NULhead;
while(1){ //NULデバイスがみつからないことはまずない
if( *(int *)NULaddr==*NULvar ){ //とりあえず 'NUL' を発見したか?
/*
! デバイス名の前10バイトめのところにアトリビュートがある
*/
if( *(NULaddr-10/sizeof(short))==NULattr ){
break;
}
}
else{
NULaddr++; // 'NUL'が奇数番地にくることはない
}
}
// B_SUPER(ssp);
/*
! デバイスチェインをかけあがる
*/
saddr=NULaddr-14/sizeof(short); //一番最初のリンクポインタ(名前のところから14バイト前にある)を得る
return( saddr );
}
/*
トランプドライバの常駐チェック
戻り値:
常駐している :デバイスヘッダが格納されているアドレス
常駐していない:-1
*/
int CheckKeep()
{
// int ssp;
int *saddr,*daddr;
int *device_name;
char *device_name_buf="TRDRV/*-"; // デバイス名(ファイル名としてアクセスできないもの)
device_name=device_name_buf;
saddr=GetNulDeviceHeader();
/*
! デバイスチェインをかけあがり、すでに常駐している自分自身のデバイスヘッダを探す
*/
// ssp=B_SUPER(0);
while( saddr!=-1 ){
if( *(int *)((char *)saddr+14) == device_name[0] && *(int *)((char *)saddr+18) == device_name[1] ){
break; //常駐しているドライバのデバイスヘッダを見つけた
}
saddr=*saddr; //ネクストリンクを得る
}
// B_SUPER(ssp);
return(saddr);
}
/*
トランプデータ出力関数
引数:
int px,py,cmnm;
px X座標
py Y座標
cnum カード番号
戻り値:
0:
-1:座標指定違反
*/
int TR_PUT(px,py,cnum)
int px,py,cnum;
{
#define CSIZE 8192
int res;
int ssp;
if( TrumpPatternBuffer==-1 ){
TrumpPatternBuffer=*(int *)((char *)(CheckKeep()+26));
}
if( px>=0 && px<=512-64 && py>=0 && py<=512-128 ){
_tr_put(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
res=0;
}
else{
res=-1;
}
return(res);
#undef CSIZE
}
/*
左半分だけ表示する(隠れるのが前提のデータ表示部分で速度を稼ぐ)
*/
int TR_PUT_LH(px,py,cnum)
int px,py,cnum;
{
#define CSIZE 8192
int res;
if( TrumpPatternBuffer==-1 ){
TrumpPatternBuffer=*(int *)((char *)(CheckKeep()+26));
}
if( px>=0 && px<=512-32 && py>=0 && py<=512-128 ){
_tr_put_lh(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
res=0;
}
else{
res=-1;
}
return(res);
#undef CSIZE
}
/*
左1/4だけ表示する
*/
int TR_PUT_LQ(px,py,cnum)
int px,py,cnum;
{
#define CSIZE 8192
int res;
if( TrumpPatternBuffer==-1 ){
TrumpPatternBuffer=*(int *)((char *)(CheckKeep()+26));
}
if( px>=0 && px<=512-16 && py>=0 && py<=512-128 ){
_tr_put_lq(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
res=0;
}
else{
res=-1;
}
return(res);
#undef CSIZE
}
/*
右半分だけ表示する(カット&ペーストしたのがばればれ)
*/
int TR_PUT_RH(px,py,cnum)
int px,py,cnum;
{
#define CSIZE 8192
int res;
if( TrumpPatternBuffer==-1 ){
TrumpPatternBuffer=*(int *)((char *)(CheckKeep()+26));
}
if( px>=0 && px<=512-32 && py>=0 && py<=512-128 ){
_tr_put_rh(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
res=0;
}
else{
res=-1;
}
return(res);
#undef CSIZE
}
/*
右1/4だけ表示する
*/
int TR_PUT_RQ(px,py,cnum)
int px,py,cnum;
{
#define CSIZE 8192
int res;
if( TrumpPatternBuffer==-1 ){
TrumpPatternBuffer=*(int *)((char *)(CheckKeep()+26));
}
if( px>=0 && px<=512-16 && py>=0 && py<=512-128 ){
_tr_put_rq(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
res=0;
}
else{
res=-1;
}
return(res);
#undef CSIZE
}
/*
上半分だけ表示する (追加:93-10)
*/
int
TR_PUT_UH(px,py,cnum)
int px,py,cnum;
{
#define CSIZE 8192
int res;
if (TrumpPatternBuffer == -1) {
TrumpPatternBuffer = *(int *)((char *)(CheckKeep()+26));
}
if (px>=0 && px<=512-64 && py>=0 && py<=512-64) {
_tr_put_uh(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
res = 0;
} else {
res = -1;
}
return (res);
#undef CSIZE
}
/*
下半分だけ表示する (追加:93-10)
*/
int
TR_PUT_DH(px,py,cnum)
int px,py,cnum;
{
#define CSIZE 8192
int res;
if (TrumpPatternBuffer == -1) {
TrumpPatternBuffer = *(int *)((char *)(CheckKeep()+26));
}
if (px>=0 && px<=512-64 && py>=0 && py<=512-64) {
_tr_put_dh(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
res = 0;
} else {
res = -1;
}
return (res);
#undef CSIZE
}
/*
上4分の1だけ表示する (追加:93-10)
*/
int
TR_PUT_UQ(px,py,cnum)
int px,py,cnum;
{
#define CSIZE 8192
int res;
if (TrumpPatternBuffer == -1) {
TrumpPatternBuffer = *(int *)((char *)(CheckKeep()+26));
}
if (px>=0 && px<=512-64 && py>=0 && py<=512-32) {
_tr_put_uq(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
res = 0;
} else {
res = -1;
}
return (res);
#undef CSIZE
}
/*
下4分の1だけ表示する (追加:93-10)
*/
int
TR_PUT_DQ(px,py,cnum)
int px,py,cnum;
{
#define CSIZE 8192
int res;
if (TrumpPatternBuffer == -1) {
TrumpPatternBuffer = *(int *)((char *)(CheckKeep()+26));
}
if (px>=0 && px<=512-64 && py>=0 && py<=512-32) {
_tr_put_dq(TrumpPatternBuffer+CSIZE*cnum,0xc00000+(py*512+px)*sizeof(short));
res = 0;
} else {
res = -1;
}
return (res);
#undef CSIZE
}
/*
カード判定用関数
引き数:
カード番号:1~54
戻り値:
1:調べたスーツに一致
0:違う
*/
//スペードのカードか?(Yes=1/No=0)
int isSPADE(cnum)
int cnum; //カード番号
{
return( (cnum>=1&&cnum<=13)?1:0 );
}
//ハートか?
int isHEART(cnum)
int cnum;
{
return( (cnum>=14&&cnum<=26)?1:0 );
}
//ダイアか?
int isDIAMOND(cnum)
int cnum;
{
return( (cnum>=27&&cnum<=39)?1:0 );
}
//ジャックか?
int isJACK(cnum)
int cnum;
{
return( (cnum>=40&&cnum<=52)?1:0 );
}
//ばばか?
int isJOKER(cnum)
int cnum;
{
return( (cnum>=53&&cnum<=54)?1:0 );
}
/*
カード数値判定
戻り値:
普通のカード :1~13
ばば :0
*/
int TR_VAR(cnum)
int cnum; //カード番号
{
return( (cnum==53||cnum==54)?0:(cnum%13)?:13 );
}
#ifdef LIBTEST
void main() //テスト用
{
int cn;
screen(1,3,1,1);
for( cn=0;cn<=26;cn++ ){ //ノーマル
TR_PUT(cn*16,0,cn);
}
for( cn=27;cn<=54;cn++ ){
TR_PUT((cn-26)*16,128,cn);
}
for( cn=0;cn<=26;cn++ ){ //ハーフ
TR_PUT_LH(cn*16,256,cn);
}
for( cn=27;cn<=54;cn++ ){
TR_PUT_LH((cn-26)*16,384,cn);
}
getch();
screen(1,3,1,1);
for( cn=0;cn<=26;cn++ ){ //クオーター
TR_PUT_LQ(cn*16,0,cn);
}
for( cn=27;cn<=54;cn++ ){
TR_PUT_LQ((cn-26)*16,128,cn);
}
getch();
screen(1,3,1,1);
for( cn=0;cn<=26;cn++ ){ //ライトハーフ
TR_PUT_RH(cn*16,0,cn);
}
for( cn=27;cn<=54;cn++ ){
TR_PUT_RH((cn-26)*16,128,cn);
}
for( cn=0;cn<=26;cn++ ){ //ライトクオーター
TR_PUT_RQ(cn*16,256,cn);
}
for( cn=27;cn<=54;cn++ ){
TR_PUT_RQ((cn-26)*16,384,cn);
}
getch();
screen(1,3,1,1);
for( cn=0;cn<=26;cn++ ){ //バリューチェック
TR_PUT(cn*16,0,cn);
printf("%d \n",TR_VAR(cn));
getch();
}
for( cn=27;cn<=54;cn++ ){
TR_PUT((cn-26)*16,128,cn);
printf("%d \n",TR_VAR(cn));
getch();
}
getch();
screen(1,3,1,1);
for( cn=0;cn<=26;cn++ ){ //スーツチェック
TR_PUT(cn*16,0,cn);
printf("%d%d%d%d%d \n",isSPADE(cn),isHEART(cn),isDIAMOND(cn),isJACK(cn),isJOKER(cn));
getch();
}
for( cn=27;cn<=54;cn++ ){
TR_PUT((cn-26)*16,128,cn);
printf("%d%d%d%d%d \n",isSPADE(cn),isHEART(cn),isDIAMOND(cn),isJACK(cn),isJOKER(cn));
getch();
}
}
#endif
/* [ EOF ] */